{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Vector-space models: retrofitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "__author__ = \"Christopher Potts\"\n",
    "__version__ = \"CS224u, Stanford, Fall 2020\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Contents\n",
    "\n",
    "1. [Overview](#Overview)\n",
    "1. [Set-up](#Set-up)\n",
    "1. [The retrofitting model](#The-retrofitting-model)\n",
    "1. [Examples](#Examples)\n",
    "  1. [Only node 0 has outgoing edges](#Only-node-0-has-outgoing-edges)\n",
    "  1. [All nodes connected to all others](#All-nodes-connected-to-all-others)\n",
    "  1. [As before, but now 2 has no outgoing edges](#As-before,-but-now-2-has-no-outgoing-edges)\n",
    "  1. [All nodes connected to all others, but $\\alpha = 0$](#All-nodes-connected-to-all-others,-but-$\\alpha-=-0$)\n",
    "1. [WordNet](#WordNet)\n",
    "  1. [Background on WordNet](#Background-on-WordNet)\n",
    "  1. [WordNet and VSMs](#WordNet-and-VSMs)\n",
    "  1. [Reproducing the WordNet synonym graph experiment](#Reproducing-the-WordNet-synonym-graph-experiment)\n",
    "1. [Other retrofitting models and ideas](#Other-retrofitting-models-and-ideas)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Overview\n",
    "\n",
    "* Thus far, all of the information in our word vectors has come solely from co-occurrences patterns in text. This information is often very easy to obtain – though one does need a __lot__ of text – and it is striking how rich the resulting representations can be.\n",
    "\n",
    "* Nonetheless, it seems clear that there is important information that we will miss this way – relationships that just aren't encoded at all in co-occurrences or that get distorted by such patterns. \n",
    "\n",
    "* For example, it is probably straightforward to learn representations that will support the inference that all puppies are dogs (_puppy_ entails _dog_), but it might be difficult to learn that _dog_ entails _mammal_ because of the unusual way that very broad taxonomic terms like _mammal_ are used in text.\n",
    "\n",
    "* The question then arises: how can we bring structured information – labels – into our representations? If we can do that, then we might get the best of both worlds: the ease of using co-occurrence data and the refinement that comes from using labeled data.\n",
    "\n",
    "* In this notebook, we look at one powerful method for doing this: the __retrofitting__ model of [Faruqui et al. 2016](http://www.aclweb.org/anthology/N15-1184). In this model, one learns (or just downloads) distributed representations for nodes in a knowledge graph and then updates those representations to bring connected nodes closer to each other.\n",
    "\n",
    "* This is an incredibly fertile idea; the final section of the notebook reviews some recent extensions, and new ones are likely appearing all the time."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Set-up"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from collections import defaultdict\n",
    "from nltk.corpus import wordnet as wn\n",
    "import numpy as np\n",
    "import os\n",
    "import pandas as pd\n",
    "import retrofitting\n",
    "from retrofitting import Retrofitter\n",
    "import utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_home = 'data'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## The retrofitting model\n",
    "\n",
    "For an __an existing VSM__ $\\widehat{Q}$ of dimension $m \\times n$, and a set of __edges__  $E$ (pairs of indices into rows in  $\\widehat{Q}$), the retrofitting objective is to obtain a new VSM $Q$ (also dimension $m \\times n$)  according to the following objective:\n",
    "\n",
    "$$\\sum_{i=1}^{m} \\left[ \n",
    "\\alpha_{i}\\|q_{i} - \\widehat{q}_{i}\\|_{2}^{2}\n",
    "+\n",
    "\\sum_{j : (i,j) \\in E}\\beta_{ij}\\|q_{i} - q_{j}\\|_{2}^{2}\n",
    "\\right]$$\n",
    "\n",
    "The left term encodes a pressure to stay like the original vector. The right term encodes a pressure to be more like one's neighbors. In minimizing this objective, we should be able to strike a balance between old and new, VSM and graph.\n",
    "\n",
    "Definitions:\n",
    "\n",
    "1. $\\|u - v\\|_{2}^{2}$ gives the __squared euclidean distance__ from $u$ to $v$.\n",
    "\n",
    "1. $\\alpha$ and $\\beta$ are weights we set by hand, controlling the relative strength of the two pressures. In the paper, they use $\\alpha=1$ and $\\beta = \\frac{1}{\\{j : (i, j) \\in E\\}}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Examples\n",
    "\n",
    "To get a feel for what's happening, it's helpful to visualize the changes that occur in small, easily understood VSMs and graphs. The function `retrofitting.plot_retro_path` helps with this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.5</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     x    y\n",
       "0  0.0  0.0\n",
       "1  0.0  0.5\n",
       "2  0.5  0.0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q_hat = pd.DataFrame(\n",
    "    [[0.0, 0.0],\n",
    "     [0.0, 0.5],\n",
    "     [0.5, 0.0]],\n",
    "    columns=['x', 'y'])\n",
    "\n",
    "Q_hat"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### Only node 0 has outgoing edges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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nbjmmmt4++23KSkpyXgHUn5ZsCRJkrRKWrRowd577809d9+99NDCjz/+mHvvvZddd+vB5599ytlnn03Xrl2pV68eEUGPnrszYsQIPv30U98qXrWaBUuSJElrJCLo1KkThx9+OC+9+AIpJRYtWsSbb77J0KFDab/BBrz04gsMGjSITp06LX2r+KOPOYann36aWbNmZb0FKWcsWJIkScq5oqIiunbtytlnn83nZc9azZ49m+eee46TTjoJgHvuvpu9996bFi1aEBG0bNWKiy++mPHjx7Nw4cKMdyCtHguWJEmS8qJZs2bsvvvuDB8+nJSsmPuAAAAXgklEQVQSKSW++OILHnjgAfbZd1++mjmTIUOG0L17dxo0aEBE0K14e+644w4mT57soYWqESxYkiRJysz666/PgAEDePyxx0gpUVJSwsSJExk2bBibbf4T/v7GBI477jg6d+689NDCgQcdxJgxY5gxY0bW8aUVWLAkSZJUbRQWFtKlSxdOOeUU/vn+e6SUmDNnDq+88gpnn302jRo35sEHHqBv3760bt2aiKBR48acc845vPbaa8ybNy/rLaiOs2BJkiSpWmvcuDE777wzQ4cOZe6cOaSUmD59Oo8++igDBg5k/rx5XH311ey88840btyYiGDzn3Thxhtv5L333qO0tDTrLagOsWBJkiSpxmnVqhV9+vThgVGjlr5V/Icffsjtt9/Odt2K+eCf73PqqaeyxRZbUFhYSESwz7778uCDDzJt2rSs46sWs2BJkiSpxosIOnfuzLHHHssbE8aTUmLBggWMGzeOIUOGsG7Lljz5xBMMHDiQdu3aERFEBCeffDLPP/883333XdZbUC1hwZIkSVKtVL9+fbbffnsuuugiZs6YQUqJr7/+mqeeeoqjjj4agJtuuolevXqx1lprERG032ADhg4dyltvvUVJSUm2G1CNZMGSJElSndGiRQv22msv7r7rrqWHFn7yySfcd9997NajJ198/jnnnnsu2267LfXq1SMi2HW3Htx333188sknvlW8flRR1gEkSZKkrEQEHTt2pGPHjgwaNAhg6VvFP/PMM9ww7EZeefklXnn5pWXud+RRR3HYoYfSvXt3WrRokUV0VVM+gyVJkiSVU1RUxDbbbMNZZ53FZ58uedZq9uzZPP/885xyyikA/Omee+jduzfrrLMOEcE667bkoosuYty4cSxYsCDjHShLFixJkiTpRzRr1oyePXsybNgwUkqklPjiiy948MEH2Xff/fjm66+45JJL2GGHHWjYsCERwXbdirn99tuZNGmShxbWIRYsSZIkaTWsv/769O/fn8ceG0NKicWLFzNx4kRuvPFGNv9JF978+xscf/zxbLrpphQUFBAR9B8wgEcffZQZM2ZkHX8ZCxYs4NRfn87YsWOzjlLjWbBqiNLSUq6//no233xzGjZsSIcOHTjzzDOZM2dO1tEk5dGHH37IhRdeyI477kirVq1o1qwZXbt25fLLL/fngSRlrKCggC5dunDyySfz/nsTSSkxd+5cXn31Vc455xwaN27Cww89RL9+/WjdujURQcNGjTj77LN59dVXmTt3bmbZ/3jrbdz94KPssU9fTjjp5NV+23rnlAWrxjj99NM544wz6NKlC8OGDWPgwIHccMMN9O3b17OTS3XInXfeyfXXX8/GG2/MhRdeyNVXX81mm23G7373O3baaSfmzZuXdURJUjmNGjVip5124qqrrmLOnO9JKTF9+nQeffRRBh50EAvmz+eaa65hl112oUmTJkQEm262OcOGDWPixIksXry4yjPOnTuXIZdcStM9T6XFkTfw0NjJbLzZTxgzZswqP5ZzCpYeQ1pbPrp165Zqi9/97ncJSG+//XaKiHTggQcuc/sNN9yQgHT//fdnlFBSvo0fPz7NmjVrhevPP//8BKRhw4ZlkGrVARNSNZgZWX3Uplklac2VlpamSZMmpTvuuCMVb989ASt87LV37zRq1Kg0derUnH/9y6+4Iq275W6p47ljln60Pviy1KxVu7T/gQPTv/71r0o/Vm2ZUymt/qzyGawaYOTIkaSUOO2005a5/vjjj6dx48bcd999GSWT6rYZM2awfoeO7LVvX+69916++eabKv+axcXFNG/efIXrDz74YADefffdKs8gScqtiGCTTTbhF7/4BePHvU5KiQULFjBu3DiGDBlCy1atefqpJznooINo3749EUFEcOKJJ/L888+v9uF8AN9++y1XXnUNDXY4dJnrG3XqytpH/A+vfJnY9CdbcMcdd7Kkc/ww55SHCNYIEyZMoKCggO7duy9zfcOGDenatSvjx4/PKJlUt3377bd8N3cBfy/ozBlX/ZG27Tuw0269uPnmm/nyyy/zmmXq1KkAtGnTJq9fV5JUNerX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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "edges_0 = {0: {1, 2}, 1: set(), 2: set()}\n",
    "\n",
    "_ = retrofitting.plot_retro_path(Q_hat, edges_0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### All nodes connected to all others"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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qVPS4Pk2YIXeU3s9sARoBDzonPvAzKYD7zjnFgFzgUfMLJeKVy4u8SNri9TEar+wDxkyhPfXvsPQnOF89sJGmgy5gbjEJn5EizmuvIzCFfOxzctZuvgF+vbtW3lfzecpFgWpVyJBoE6JeEudkljg5xEsnHMvAS/V2DalyvWvgQsjnas+MjMzeWflW1z3qxt54rGbSB16M/HpLf2O1aCVFe6l8OW7Ob5NBs+9v46jjz7a70hRKci9EolG6pSIt9Qpaega/hcDhVFiYiJzHpjN/XfOZP/Tt1H44at+R2qwDn32EXsfm8iVw89k+atLNVyJiIiISFTy9QhWQzFmzGh69uzBOcPOo0inY3nOMIrXPseCR//Gueee63ccEREREZE6acDySLdu3diw/j3+9a9/+R2lwXn0r3OIi4ujU6dOfkcRERERETkiDVgeysjIoE+fPn7HaHCysrL8jiAiIiIiUi86B0tERERERMQjGrBEREREREQ8ogFLRERERETEIxqwREREREREPKIBS0RERERExCMasERERERERDyiAUtERERERMQjGrBEREREREQ8ogFLRERERETEIxqwREREREREPKIBS0RERERExCMasERERERERDyiAUtERERERMQjGrBEREREREQ8ogFLRERERETEIxqwREREREREPKIBS0RERERExCMasERERERERDyiAUtERERERMQjGrBEREREREQ84suAZWbNzewfZrYp9N9mdax72cz2mtkLkc4oEjTqlYi31CkRb6lTEiv8OoL1H8Ay51xnYFnodm3uAkZHLJVIsKlXIt5Sp0S8pU5JTPBrwMoB5oWuzwPOq22Rc24ZcCBSoUQCTr0S8ZY6JeItdUpiQrxPf24r59xOAOfcTjNr+UMezMzGAeNCNwvMbOMPDViLo4D8MDyu14KSE4KVNdvvAPUQtF4F6fkPStag5AR1Sp1SVq+pU/r9Lwg5IVhZ/61ehW3AMrOlQOta7rrV6z/LOfcA8IDXj1uVmb3jnOsVzj/DC0HJCcHL6ncGaFi9CtrzH4SsQckJ6lQ4BO35V1ZvqVPhEaTnPwg5IXhZ/52fC9uA5ZwbVNd9ZvaFmbUJvXrRBvgyXDlEGhL1SsRb6pSIt9QpEf/OwVoEjA1dHws851MOkYZEvRLxljol4i11SmKCXwPWfwGDzWwTMDh0GzPrZWZzvllkZsuBJ4GBZpZnZmf6krZCWA9BeygoOUFZvRa0XgVhn34jKFmDkhOCkVWdCh9l9V4QcgatUxCM/QrByQkxkNWcc14HERERERERiUl+HcESERERERFpcDRgiYiIiIiIeEQDVg1mdpaZbTSzXDM77BvGzSzRzB4P3b/KzDpEPmW9cv7GzD40s/fNbJmZtfcjZyjLEbNWWXeBmTkz8+WjO+uT08wuCu3XD8xsfqQzBpE65b2gdCqUQb3yWFA6FcoSiF6pU7FNnQqPoPQqLJ1yzukSugCNgM1AJ6AxsB7oUmPNtcDs0PVLgMejNOfpQEro+ng/ctY3a2hdGvAGsBLoFY05gc7AWqBZ6HZLP/ZpkC7qlD9ZQ+t87dT32K/qlff71PdOfY+svvdKnYrtizrlX9bQugb5+5+OYFXXG8h1zm1xzhUDC4CcGmtygHmh609R8Qk3FsGMUI+czrlXnXMHQzdXAm0jnPEb9dmnALcDdwJfRzJcFfXJeRXwZ+fcHgDnnL6/47upU94LSqdAvQqHoHQKgtMrdSq2qVPhEZRehaVTGrCqOwbYUeV2XmhbrWucc6XAPqBFRNLVkiGktpxVXQksDmuiun1nVjPrCbRzzr0QyWA11GefHgccZ2ZvmdlKMzsrYumCS53yXlA6BepVOASlU9VyhERrr9Sp2KZOhUdQehWWTsV7GLAhqO3ViJqfY1+fNeFW7wxmdhnQCzg1rInqdsSsZhYHzAIuj1SgOtRnn8ZTcZj4NCpeEVpuZl2dc3vDnC3I1CnvBaVToF6FQ1A6BcHplToV29Sp8AhKr8LSKR3Bqi4PaFfldlvgs7rWmFk8kAHsjki6WjKE1JYTMxsE3Aqc65w7FKFsNX1X1jSgK/CamW0D+gCLfDjRsb7P/XPOuRLn3FZgIxWFk7qpU94LSqdAvQqHoHSqWo6QaO2VOhXb1KnwCEqvwtOpSJ9MFs0XKibULUBHvj3R7cc11lxH9RMdn4jSnD2pOGmvc7Tv0xrrX8Ofkxzrs0/PAuaFrh9FxSHlFn7u32i/qFP+ZK2x3pdOfY/9ql55v09979T3yOp7r9Sp2L6oU/5lrbHel16Fq1O+7fhovQDnAB+H/nHeGto2nYpXAQCSgCeBXGA10ClKcy4FvgDWhS6LonWf1ljr5/+4vmufGvAn4EPgn8Alfu3TIF3UqchnrbHWt07Vc7+qV97v06joVD2zRkWv1KnYvqhT/mStsda3XoWjUxb6QREREREREfmBdA6WiIiIiIiIRzRgiYiIiIiIeEQDloiIiIiIiEc0YImIiIiIiHhEA5aIiIiIiIhHNGCJiIiIiIh4RAOWiIiIiIiIRzRgxRgzO9HM3jezJDNrYmYfmFlXv3OJBJl6JeItdUrEW+pUZOmLhmOQmc2g4lvJk4E859wdPkcSCTz1SsRb6pSIt9SpyNGAFYPMrDGwBvga6OecK/M5kkjgqVci3lKnRLylTkWO3iIYm5oDqUAaFa9kiMgPp16JeEudEvGWOhUhOoIVg8xsEbAA6Ai0cc5d73MkkcBTr0S8pU6JeEudipx4vwNIZJnZGKDUOTffzBoBK8zsDOfcK35nEwkq9UrEW+qUiLfUqcjSESwRERERERGP6BwsERERERERj2jAEhERERER8YgGLBEREREREY9owBIREREREfGIBiwRERERERGPaMASERERERHxiAYsERERERERj/w/8Rp4/ojOV+oAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 864x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "edges_all = {0: {1, 2}, 1: {0, 2}, 2: {0, 1}}\n",
    "\n",
    "_ = retrofitting.plot_retro_path(Q_hat, edges_all)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### As before, but now 2 has no outgoing edges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAEYCAYAAABBWFftAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XmczXX///HHe/bVmDFDGHuE7IZKorJEV2QbifaiFGVpLypLSaHIpX355squQgqFCNlSJNllS2bGPmP29++PyfwsY585n3POPO+3m9ut8/m8z/k853bN9Zrz+izvt7HWIiIiIiIiIpfPx+kAIiIiIiIi3kINloiIiIiISD5RgyUiIiIiIpJP1GCJiIiIiIjkEzVYIiIiIiIi+UQNloiIiIiISD5xtMEyxrQyxmw0xmwxxjx7ljGdjTF/GGPWG2O+cHVGEfEeqjki4iqqNyKFl3FqHSxjjC+wCWgB7AZWAndaa/84aUxlYDJws7X2oDGmuLV2vyOBRcSjqeaIiKuo3ogUbk5ewWoIbLHWbrPWpgMTgdtPG9MdGGutPQigwiMil0E1R0RcRfVGpBDzc/DYpYFdJ73eDVxz2pgqAMaYJYAv8LK19rvTP8gY0wPoARAaGlq/atWqBRJYRM60evXqRGttjNM5LoBqjoiHU71RvRFxpUutOU42WCaPbaffr+gHVAZuBGKBxcaYGtbaQ6e8ydr3gfcB4uLi7KpVq/I/rYjkyRjzl9MZLpBqjoiHU71RvRFxpUutOU7eIrgbKHPS61hgbx5jvrbWZlhrtwMbySlGIiIXSzVHRFxF9UakEHOywVoJVDbGVDDGBABdgBmnjfkKuAnAGBNNzuX0bS5NKSLeQjVHRFxF9UakEHOswbLWZgK9gDnABmCytXa9MWaQMabtv8PmAEnGmD+ABcBT1tokZxKLiCdTzRERV1G9ESncHJumvaDo/mQR1zLGrLbWxjmdwymqOSKuo3qjeiPiSpdacxxdaFhERERERMSbqMESERERERHJJ2qwRERERERE8okaLBERERERkXyiBktERERERCSfqMESERERERHJJ2qwRERERERE8okaLBERERERkXyiBktERERERCSfqMESERERERHJJ2qwRERERERE8okaLBERERERkXyiBktERERERCSfqMESERERERHJJ2qw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sSZNmjB79mz+2bePmrVqk52d7XQkERERERGPpgarkGvdujWTJk1iwx/raXLjTVhrnY4kIiIiIuKx1GAJnTt35v33P2DJ4kW069DR6TgiIiIiIh5LDZYA0L37Q7zx5pvM+OpLHnyou9NxREREREQ8kp/TAcR9PNm/PwcOHOS1V4cSFRXFG8NfdzqSiIiIiIhHUYMlp3h16BAOHDzIm28MJyoykueee9bpSCIiIiIiHkMNlpzh3f+O5cCBAzz//HNERETw6KM9nY4kIiIiIuIR1GBJniZN+IKkpCQee+xRIiKK0K1bN6cjiYiIiIi4PU1yIXkyxvD93DnUrluPu+66ixkzZjgdSURERETE7anBkrMyxvDLqpWUKVuW22+/nQULFjgdSURERETEranBknPy8fFh29athISGcvPNN7N8+XKnI4mIiIiIuC01WHJefn5+HEhKAuDaa69l3bp1DicSEREREXFParDkggQGBpKcnAxArVq12Lx5s8OJRERERETcj2YRlAsWEhLCkSNHKFKkCFWqVOGvv/6ibNmyTscSEQ+XlpbGa68PJysjnT///JPVq1ezfft2ypUrx44dO5yOJyIiclHUYMlFCQ8P58CBA0RFRVGuXDn27t1LyZIlnY4lIh6sb/+nGfffMWAtUVFR1KtXj0OHDjkdS0RE5JI4eougMaaVMWajMWaLMebZPPY/YoxZZ4z51RjzkzGmuhM55VSRkZHs27cPgFKlSpH07/NZIu5ONcf9fP3113w+cTIR13fltrbtSUpKYt68eZQqVcrpaCKXRfVGpPByrMEyxvgCY4HWQHXgzjyKyxfW2prW2jrAcGCki2PKWZQoUYJdu3YBEB0dzeHDhx1OJHJuqjnuZ+fOndxz/4OEtupP6FWN+XnFCqy1TscSuWyqNyKFm5NXsBoCW6y126y16cBE4PaTB1hrj5z0MhTQX143Ehsby9atWwEoWrRo7iQYIm5KNceNZGZm0q7THfjXaUtQbDX8isVyPC2dbdu2OR1NJD+o3niQ1157jfj4eCpWrIgxhvLlyzsdSTyckw1WaWDXSa93/7vtFMaYx4wxW8k5u/O4i7LJBapYsSLr168HICwsjNTUVIcTiZyVao4bee6FAew4nEVog/ZAzsLmweVq8cMPPzicTCRfqN54kOeff5758+dTqVIlIiMjnY4jXsDJBsvkse2MszfW2rHW2krAM8CLeX6QMT2MMauMMasSEhLyOaacT/Xq1Vm1ahWQMwlGRkaGw4lE8qSa4ybmzp3LuA8+IrTlExjz//8M2ZI1mPntXAeTieQb1Rs390S//lx/YzMAtm7dquc/JV852WDtBsqc9DoW2HuO8ROBdnntsNa+b62Ns9bGxcTE5GNEuVD169dn0aJFZGZmElumLFlZWU5HEjmdao4b2LdvH1263U3YLX3xDS16yr6gcrVZ9ONCPYcl3kD1xo39888/fPjhR/y2bj3Lli2jYsWKTkcSL+Nkg7USqGyMqWCMCQC6ADNOHmCMqXzSy/8AWt3Wjd1www18++237P9nH1fXqEl2drbTkUROpprjsKysLNrHd8GnWnOCytU6Y79fRHEICOb33393IJ1IvlK9cWOvvT6c4KpNCKzfjoGDhjodR7yQYw2WtTYT6AXMATYAk621640xg4wxbf8d1ssYs94Y8yvQD7jXobhygVq1asWkSZPY+OcGGjdpqjPR4jZUc5w3aMhQNv59iNBr7zjrGP/YmnoOSzye6o37SkxM5IMPPyIorgOhNVuwdNkyNmzY4HQs8TKOLjRsrZ0NzD5t28CT/vsJl4eSy9a5c2eOHDlK9+4PcXv7Dsz46kunI4kAqjlOWrx4MSPeGkPRrm9ifHzPOs6UrsmM2XoOSzyf6o17enPkKIKrNMKvSM7tlkG1bmXQq8OY8PlnDicTb+LoQsPivR566EHeHDGCmV9/xQMPPuR0HBFxUGJiIu3j7yC0eS/8wqNzt2enJbN77L0cW5dzxerY7/NJ/2cbi3/8gYSEBA4fPsyQIUMYMmQIn3/+uVPxRcRLHDp0iLH/HUdgXMfcbSF1b+Xrr75m9+7dDiYTb+PoFSzxbv379ePgwUMMHTKYqKgo3nxjuNORRMTFrLV07no3VLye4Epxp+xL272BrOSDJM0eRcbBPaTt/oO0XTnPX+3fvx+AAQMGANC0aVPuvvtu14YXEa8y6q23CawQh3/RK3K3+QYXIeTqmxj+5khGv6W1niV/6AqWFKghgwfR87FejHjzDV599TWn44iIi73x5gjWbN5F6PV3nbEvZdNSsNmE1b6FI8smg/Gh7FNfE3VNO4YMGYq1NvffwoULXR9eRLzG0aNHGfX26FOuXp0QVK8tH338MYcOHXIgmXgjNVhS4P77zhg6d+nCCy88z9ix/3U6joi4yIoVK3hl6GuEtuqH8T3zholj674HoFir3kTd8hhpO9eyc0RHfK64ihlaD0tE8tHod94hoGxt/IvFnrHPr0hxgis1YMzYsQ4kE2+kWwTFJSZ+8QWJiUn06vUYERFFuOuuM89mi4h32bhpM1npaSR/PQj/EleSWawSgSWrEFCiIsYvAGw2IVddD0B4ndb4R8Xyz4TnSPz6dY4EBZOamkpQUJDDP4WIeLrk5GTeeHMUIe1eyt2WeSSR7LRkAmLKcez3+aT5BPHq0FcpEh5Geno6Q4YMAaBcuXK6PVkumhoscQljDN/PnUPd+nHcfffdhIeHc/vttzsdS0QK0N13dePOLnewYcMGVq5cyaIly1iy7DN2bttCWPGcNVh9QoqSnvAX/sViCSpbk1I9PmDv+91JTz3O+PHjeeghTZIjIpdn3Lvv4VeyKgEx5XO37Rv/JFlHE4m6pRfJfyzMff4z9XgKoOc/5fLoFkFxGWMMv6xaSZmy5WjXrh3z5893OpKIFDA/Pz9q1qzJAw88wKcffcDmP9Zy6GASD3bJOcFSPyoD5r3BP+90JXn6AI6v+46o1n0A6N69O9OmTXMyvoh4uNTUVF59fTgBDTqdsj3raCIYHw7MeQe/iBKUfXomJboOo1TZCmRmZur5T7ksarDEpXx8fNi2dQth4eE0a9aM5cuXOx1JRFwsODiYJUuWAjB/7rfs3bmdvbt38r93htGnVW1qZ22iSGQ04RFF6dSpEy8OGHieTxQRydsHH36IT3RFAkpUOnOn8SGiUReSf/+BPePuJ+CKyhz3DdWJHblsarDE5fz8/EhKTATg2muvZe3atQ4nEhFX+/nfkys+Pjl/hqKiomjZsiUDBw5g/pxvOJS0n4NJidx1z70MHTKYZi1akp2d7WRkEfEw6enpDBr6Gv5xnfLcb3x8KXrDXcR0GEDW0UR2jeyIT7XmvDT4Vay1Lk4r3kQNljgiICCAlJSc+5xr167Npk2bHE4kIq6UnZVJeJGIs+43xuDr68vnn33KmDFjmP/9PMKLFMmtGyIi5/PJJ5+SXaQ0gaWuynuAjy8AIZWvodSD4wBImv0Wu/cl6DEGuSznbbCMMb2MMZGuCCOFS3BwMEeOHAHgqquu4q+//nI4kbgD1Rzvd6JJand72wsa36tXL3744QdSkpMJDQ1l3759BRlPChHVG++VkZHBS4OH4t8g76tXwCnLR/hHlyH28S8AOJa4l569nyjwjOK9LmQWwSuAlcaYX4CPgTlW100ln4SHh3PgwAGioqIoX748e/fupWTJkk7HEmep5ni52bNnAxAfH3/B77n55pvZtGkTVapUoWTJkqxdu5aaNWsWVEQpPFRvvNTy5ctJ+HsPxZZPIGWFAR8fjPHBGoMxOdcXbPpxjs8eDsaA8QHjQ3Ttmzm4cQWbN6znvgce4JOPPsIY4/BPI57GXEgdMTm/WS2B+4E4YDLwkbV2a8HGu3hxcXF21apVjhzbGIOvnz+ZGemOHN+T7d+/nxIlSgCQkJBAdHS0w4nkQhljVltr4/L5M1VzvFinTp2YNm0aaWlpBAQEXNR7k5KScuvDV199peUeChnVG9WbC2WtZdmyZWRmZpKVlUV2djZZWVm5/9q0aQPGMHXKlDz3j//fF8z/4Xtq1a7DqpUr8Pf3d/pHEgdcas25oHWwrLXWGLMP2AdkApHAVGPMPGvt0xd7UJHTFS9enN27dxMbG0tMTAyHDh0iIuLsz2eId1PN8W6zv/0O4KKbK4BixYqRmppK5SpVaNeuHYMGDWbAgBfzO6IUIqo33skYQ6NGjc45xs/Pn44dO+a57/7772f8+PHcfffdBAQEcODAASIjdTepXJgLeQbrcWPMamA4sASoaa3tCdQH8v6tFLkEpUuXZuvWnBOGRYsWJTk52eFE4gTVHO93PCUZP/+Lb65OCAwM5K8dO+jcpQsDBw7g1ttu0wyDcklUbwq38936d9ddd3HiimFUVJQm5JILdiGzCEYDHay1t1hrp1hrMwCstdnAbQWaTgqdihUr8scffwAQFhZGamqqw4nEAao5XiwrKwuAG5s2uazPMcYwacIERowcybfffENUsWiOHz+eHxGlcFG9KcQu5Nmq+vXrs3fvXiBnQq5vv/22oGOJFzhvg2WtHWitzXN6N2vthvyPJIVdtWrVWL16NZDTZGVkZDicSFxJNce7LV68GIBu3brly+f169uXuXPncvjQQUJCQti/f3++fK4UDqo3hduJdfjOp2TJkqSkpFAsOoZbb72VwYOHFHAy8XRaB0vcUr169Vi8eDFZWVmUKh2be9ZbRDzbtGnTAGjb9sKmaL8QLVq04M8//wSgRIkSrF+/Pt8+W0S814U2WJCztEzC/n+IvyPn1uSbm7fQdxM5KzVY4rYaN27Mt99+S2LCfqpfXUPPWIh4gYmTJgE5zzPkp6uuuoqEhAQAatSowaxZs/L180XE+1xMgwU5txROnjiBd955hwU/fI+fnx9Hjx4toHTiydRgiVtr1aoVkydPZtPGP2l8QxO0PImIZ0tMSMhZc6YAREfnPId1RcmStGnThtdeG1YgxxER73CxDdYJjz32GIsWLQKgSJEi/PVXnneZSiGmBkvcXnx8PB9++BHLli6hbbv2TscRkctUs0aNAvvsoKAg9u7ZQ4dO8Tz//HO0bddeV79FJE+X2mAB3HDDDezYsQOA8uXL5z5fKgJqsMRDPPjgA4wYOZJZM77mvgcedDqOiFyCE89G3X333QV6HGMM06ZM5vXhw5n59VeUuKKkZiQVkTP4+l7e1+By5cpx5MgRjDE0adKEd955J5+SiadTgyUeo1/fvrzw4gA+++Rj+j/5pNNxROQinZjgokOHDi453tNPPcXs2bNJTNif84D6v89oiYgA+Pr6XvZnhIeHk5GRwU3NmtO7d2/i7+iiq+aiBks8y5DBg+j5WC9GjhjBkCFDnY4jIhdh/PjxAFSqVMllx2zdunXu2nrFixfPnW1QRMQvHxosyGnU5n8/j0GDBjN18iRiipfQunyFnKMNljGmlTFmozFmizHm2Tz29zPG/GGMWWuM+cEYU86JnOJe/vvOGDp36cKAAS8yduxYp+OIB1HNcdbmzZsdOW61atVy18eqVq0ac+bMcSSHFC6qN+4vP65gnWzAgBeZPXs2B5ISCQkJ4e+//87XzxfP4ViDZYzxBcYCrYHqwJ3GmOqnDVsDxFlrawFTgeGuTSnuauIXX9CsRUt69erF559/7nQc8QCqOe6hVOnSjhw3JiaGlJQUoopF06pVK94cMcKRHFI4qN54hvxusCDnqvnGjRsBKFWqFKtXr873Y4j7c/IKVkNgi7V2m7U2HZgI3H7yAGvtAmttyr8vfwZiXZxR3JQxhnlzvqNe/TjuuecevvrqK6cjiftTzXHQvn37AOjWtatjGU4sFHpb29t56skn6dT5Di39IAVF9cYD+Pn5FcjnVqlShQMHDgAQFxenE8GFkJMNVmlg10mvd/+77WweBL4t0ETiUYwxrFyxnLLly9O+fXt++OEHpyOJe1PNcdCXX34JQMeOHR3N4ePjw8yvv2Lo0FeZNmUysWXKkJaW5mgm8UqqNx6goBosgMjISNLT06lVuw733HMPjzz6mE7oFCJONlh5rTSZ52+eMeYuIA544yz7exhjVhljVmmWqMLFx8eHrZs3Ex5ehObNm/Pzzz87HUncl2qOg05McNGgQQOHk+R4/vnnmDFjBnv37CEoKIjExESnI4l3Ub3xAAXZYAH4+/vz65pf6NO3L++N+y9Vq1UnPT29QI8p7sHJBms3UOak17HA3tMHGWOaAy8Aba21eZ5mtNa+b62Ns9bGxcTEFEhYcV9+fn4kJub80bnuuuv47bffHE4kbko1x0E/L18BXN7CnvmtTZs2rFu3Dsif85CkAAAgAElEQVR5RuvEcxMi+UD1xgMUdIMFOXfbjBo5kkmTJrFp458EBgbqhE4h4ORfupVAZWNMBWNMANAFmHHyAGNMXeA9cgrPfgcyiocICAggJSXnVvY6deqwadMmhxOJG1LNcVB2VibhRSKcjnGGGjVq5D4fVrVqVebNm+dwIvESqjcewBUN1gmdO3fm119/BXJO6GzYsMFlxxbXc6zBstZmAr2AOcAGYLK1dr0xZpAxpu2/w94AwoApxphfjTEzzvJxIgQHB3PkyBEArrrqKv766y+HE4k7Uc1xzomTH+3b3X6ekc4oUaIEycnJFCkSQcuWLRn11ltORxIPp3rjGVzZYAHUrl2bf/75B4Dq1avz9ddfu/T44jqu/c06jbV2NjD7tG0DT/rv5i4PJR4tPDycAwcOEBUVRfny5dm7dy8lS5Z0Opa4CdUcZ3zzzTcAxMfHO5zk7EJCQjh48AC33taGfn37snzFCib8738Yk9ejNCLnp3rj/vz9/V1+zOLFi3P8+HGurFyZdu3a8fwLLzJ0yGCX55CC5T43w4vkk8jIyNwzRKVKldK9ziIOmzRpEgAtW7Z0OMm5+fj48N3sb3jp5VeYNGEC5cpX0AyDIl7MiQYLICgoiF07d3L3vffx6tAhNGp8A5mZmY5kkYKhBku8UvHixdm9ezeQc6/z4cOHHU4kUnjN/vY7IOdZSU/w8ksDmT59Ort2/kVQUFDuejYi4l2carAgZ/KL//v0E957732WLfkJf39/fVfxImqwxGuVLl2arVu3AlC0aFGSk5MdTiRSOB1PScbP3zOaqxPat2+fOyNpsWLF2LJli8OJRCS/OdlgndCjR3eWLVsG5HxX2bZtm8OJJD+owRKvVrFiRf744w8AwsLCSE1NdTiRSOGSlZUFwE03NnU4ycWrVasWe/fmzKxduXJlFixY4HAiEclP7tBgAVx77bXs2pWzLnWlSpWYP3++w4nkcqnBEq9XrVo1Vq9eDeQ8yJ6RkeFwIpHCY9GiRQB069bN4SSXpmTJkhw7dozgkBBuvvlmxo4d63QkEckn7nTbcmxsLMeOHSMoOJhmzZrx5ogRTkeSy6AGSwqFevXqsXjxYqy1lCxVOvesuogUrGnTpgE5i/p6qtDQUI4eOcLNzVvQq1cv7rnvfqy1TscSkcvkTg0W5NSa5GPHuPW223jqySdpc3s7srOznY4ll0ANlhQajRs35rvvviMpMYGq1aqraIm4wKTJkwGIiopyOMnl8fX15Yd5c3lxwEA+/+xTKle5ivT0dKdjichlcLcGC3JmM/1m5kxeHz6cWTO+JkLPkHskNVhSqNxyyy1MmTKFLZs30ajxDToLLVLAEhMSABg1ahRVq1YlKCiIMmXK0L9/f4/80jB40CtMnTqVrVs2ExgYyMGDB52OJCKXyF2ewcrL0089xffff8+xo0cJCwtjz549TkeSi6AGSwqdTp068eGHH7F82VLa3N7O6TgiXq9YsWL069eP6tWrM2bMGOLj4xk9ejRt2rTxyCvJHTt2ZM2aNUDOlTnN+iXimQIDA52OcE7NmjXLncE0NjaW5cuXO5xILpQaLCmUHnzwAUaMHMk3M2dw7/0POB1HxCv9/vvvABw4cIAOHTowffp0unfvzsiRIxk5ciQLFixg4sSJDqe8NHXq1Mk9o1ypUqXcyTxExP2dOLHjjrcInq5SpUocOnQIyJlt8KOPPnI4kVwINVhSaPXr25cXBwzk/z79hL79+jkdR8TrTJ8+HQBrLX369DllX/fu3QkJCWH8+PFORMsXpUqV4tixY/j7+9O0aVPeffc9pyOJyAU40WD5+fk5nOTCREREkJGRQcNrr+Ohhx7i/gce1CMObk4NlhRqgwe9wqO9evPWqFEMHjzE6TgiXuVE8+Tj40PDhg1P2RcUFESdOnVYuXKlE9HyTWhoKMePH+eGJjfSs+cjPNS9h774iLi5ExPUeEqDBTlZly9byjPPPsenn3xM+QoVSUtLczqWnIUaLCn0xo4ZTZeuXRk4cABjxoxxOo6Ix5g3bx61466l1+N9mDBhAlu3bj2ludi8eTMA0dHReT7rULp0aRITEz1+Nj5fX18W/biAp595lo8+/ICra9TUensibiwzMxPI+f+upxn22qtMnz6dnX/tICgoiIR/JxIS9+I5rbtIAfpi/HiSkg7w+OOPExERwT333ON0JBG3d/DgQbbt2c+udYeZvPBdju/ti81Io069+tzYuBGQ8wXmbA+SBwUFAZCSkuIRz0Kcz+vDXqNundrceeedBAQEcPDgQYoWLep0LBE5jSdewTpZ+/bt+f3336lRowbFixdn7dq11KxZ0+lYchLP/M0SyWfGGOZ8O5u4htdw7733UqRIEdq10wyDIudy0003kXEkgai4dhhfP0KAzKNJbNq3mT/mbwRjyMrOZveePbRu256bGl/HNddcQ/369QkLCyM1NRWAkJAQZ3+QfNSlSxcqV65MXFwckZGRbN++nfLlyzsdS0RO4slXsE64+uqrSUhIICYmhlq1ajFlyhQ6derkdCz5l24RFPmXMYaVy3+mXPkKtG/fnh9++MHpSCJuLSYmhtJlypK+b3PuNr/wYoRUvpYiN9xDuadnElSuDtZaVmSWY/i0pXR6oBdR0cUpX7kqK1etIjo62iuuXp2sfv367Nq1C4AKFSqwZMkShxOJyMm8ocGCnNuvU1NTqVjpSuLj43nyqaf1DKibUIMlchIfHx+2bN5EeHgRmjdvzrJly5yOJOLWWrdsQdrOtWfdH1CyCliLf2RJwm7qTmj8MEr2/oLEVNi9axdxcXEuTOs6sbGxHDlyBIDGjRvz0UcfO5xIRE448YykOy80fKECAwPZsnkTPR5+hBFvvkG9uAZ6BtQNqMESOY2fnx+JiTkPjTZq1IjffvvN4UQi7qtVy+b47lt/1v2h1W4ADEdXzcjdlvLbd4RlHSMzM5Nu3bq5IKUzwsPDycjI4JrrGvHQQw/yyKOP6eyyiBvwlitYJxhjeO/dcXz66af8+svq3GdAxTlqsETyEBAQQEpKCpCzoOjGjRsdTiTinpo0acKRnX+SnZH3dMEBMeUJr/cfUjYtZf+XQzm46HMOL/qMpIR/aNq0KV27dnVxYtfy8/Pj56VL6Ne/P++N+y+169bT2WURh52Y5MJbGqwT7r333tylL6KionJnchXXU4MlchbBwcG5t/hUrVqVv/76y+FEIu6nSJEiVK5anbQ9G846JrJZdyJveoCMhB0cWTaJsJBgevfuzaxZs/DxKRx/hka8+Sbjx49n3W+/EhAQwOHDh52OJFJoZWVlAZ47i+C5xMXFsWfPHgCqVKnCnDlzHE5UOBWOv2wilyg8PJwDBw4AUL58ef7++2+HE4m4n9tatSBj17qz7jc+voQ3aE9ATDlatv4PCQkJjBw5krCwMBemdF63bt1Yvnw5AEWLFmXnzp0OJxIpnLz1CtYJpUqVIjk5mYiikbRq1YpXX33N6UiFjhoskfOIjIzkn3/+AXKKVmJiosOJRNzLLS1b4PP37+ccc+y3ORzfvoa5336Dn58f1ze+gZUrVxa6Z5IaNmyY21iVK1eOn3/+2eFEIoXPiStY3jDJxdmEhIRwICmR9h078cILz9Pilla5P7cUPDVYIhegePHi7N69G8iZmvrQoUMOJxJxH9dddx3H9u0gOy05z/3pCTtI+/l/rP9tDX/88QftO3Rk6ZKfaNiwIT4+PnSK78yff/7p4tTOKVOmTO4tgtdddx3/93//53AikcLF2ya5OBsfHx+mT53CW2+/zfdz5xAcHMyxY8ecjlUoqMESuUClS5dm27ZtQM5VLRUpkRxBQUHUrhdH6q4zr2Jlp6eS/O0IRo8cQbVq1ahWrRrTp00lOzubFStWcF2j65k2dQrVqlXDGEPvxx/PXUPKmxUpUoSMjAzq1o/j3nvv5Yk+fQrd1TwRp5yYaMYbn8HKyxOPP87ChQvJyMggPDxctye7gKMNljGmlTFmozFmizHm2Tz2NzHG/GKMyTTGaHlqcVyFChXYsCHnYf7w8HBSU1MdTiQXQzWn4LRp1YKs3Wc2WCk/fsAtTa/j/vvvO2W7MYYGDRqwdMlPZGZmMnfuXMqVr8A7Y8ZQtmxZjDEMGTKEpKQkF/0Erufn58fqlSvo1ftxRr/9Ng2uuTb3zLp4PtUb9+XNk1ycTdOmTdm+fTuQc3uyFkAvWI41WMYYX2As0BqoDtxpjKl+2rCdwH3AF65NJ3J2VatW5ZdffgFyZho88bCsuDfVnILVokVz7J5TJ7o4tn4BIQe28PEH72GMOet7fX19adGiBTu2byM1NZXJkycTFBzMgAEDiI6Ozlnj5b33vPKqsTGGMaPf5pNPPmH1yhX4+/vnzl4qnkv1xr2d+Lt9osHKzs5m1KhRVK1alaCgIMqUKUP//v1JTs77tmdPVb58+VMWQB837l2HE3kvJ69gNQS2WGu3WWvTgYnA7ScPsNbusNauBbKdCChyNnXr1mXx4sUAXFGylB4c9QyqOQWofv36pB76h6zknOcTMw7sIXXRx8z8atpFzRYYGBhIfHw8x1NSOHr0KOPGjQPgkUceITw8nJDQUKZOnep1Jzbuu+8+li5dCkBEREShuE3Sy6neuLHTJ7no27cv/fr1o3r16owZM4b4+HhGjx5NmzZtyM72rv95wsPDyczMpEnTm3j00Z506dpVtycXACcbrNLAyX9Bdv+7TcQjNG7cmDlz5nDwQBJXVa3mdUXYC6nmFCA/Pz+uva4xqTvXYTPTSf72TYa9OpjatWtf8meGhYXxyCOPYK0lISGBQYMGcTwlhfj4eAIDA6lQsRLff/+915zguO6669ixYwcAZcuWzV0wVDyS6o0bO3mSi/Xr1zNmzBg6dOjA9OnT6d69OyNHjmTkyJEsWLCAiRMnOpw2//n6+vLjwvkMfOllJk2YQMlSpTh+/LjTsbyKkw1WXveLXFILbYzpYYxZZYxZlZCQcJmxRC5cy5YtmTJlClu3bOa66xvrLJB7U80pYG1at4C960he9AnX172axx59NN8+Ozo6mgEDBmCtZefOnTzWqxc7tm+jRYsW+Pn50ej6xl4x7Xu5cuVyZylt2LAh//vf/xxOJJdI9caNnWiw/P39mTBhAtZa+vTpc8qY7t27ExISwvjx452I6BKvvPwSM2fO5J99+wgJCWHfvn1OR/IaTjZYu4EyJ72OBfZeygdZa9+31sZZa+NiYmLyJZzIherUqRMff/wxK35exn/atPH4L3heTDWngDVv3pxD6xbg//dv/O//Pjnnc1eXo0yZMrwzZgzWWjZs2ECHjp1YtnRJ7rTvHTvFe/S07xEREaSnp1Ozdh3uuusu+j/5pNOR5OKp3rixkye5WLlyJT4+PjRs2PCUMUFBQdSpU8frryTfdtttufWyZMmSrFmzxuFE3sHJ6VNWApWNMRWAPUAXoKuDeUQu2f3338+hw4fp17cv99x3P59/9qnTkeRMqjkF7Oqrr6ZN27Y8+2Q/ihYt6pJjVq1alWlTp2CtZdWqVTzRpy/Tp01l+rSpAPTq3Zunn3qKMmXKnOeT3Iu/vz+/rfmFR3v1ZuSIESxZuoyfFv1YqGY983CqNw776JPPWPTTT/j6+ODn64uPjy9+fjn/Nm3aCMCHH33EmjVrCA4O5o033sDX1xcfHx98fX1p0qQJpUuXZunSpaSnpxMQEODwT1RwrrrqKpKSkihWrBj16tXjf//7H1276tf1cjhWqa21mcaYXsAcwBf42Fq73hgzCFhlrZ1hjGkAfAlEAm2MMa9Ya692KrPIufTt04eDBw8xeNArFIuK5K1Ro5yOJCdRzSl4Pj4+TJ/szPMKJ0/7npWVxYIFC+je42HeGTOGd8aMAWDw4ME88sgjREdHO5LxYhljGDf2HerXrUv37g/h7+/P0aNHL2rSEHGG6o3zJk+dxuI/9xJcqQHWZkN2JtisnLtMbDThcbczY1sWR48ex2ZbRny7DmMt2GyO7/iV21b/SnBQEAApKSle3WABREVFkZ6eTt169enWrRtLl/3MmNFvF9idCN7OeNvtTHFxcXbVqlWOHNsYg6+fP5kZ3jW7lVycXo8/wdgxo3nllUEMHDjA6TgFzhiz2lob53QOpzhZc+T80tLSmDFjBvfcey+pJz3E/e6779KtWzePaVaWLFlC48aNAdi9ezelSxfO+RJUb1RvLtSyZcu4pW0nIu8fh/HxPeu4vR89RlbKYcr0znnWKjsjjQOfPMJP8+fy6quvMmXKFNLS0ry+wTrBWssTffowZvRoqlW/ml/X/FJofva8XGrNcXShYRFv9M7ot+nStSsvvTSQMf+eORcRZ5w+7fu77+as+3Ji2vfgkBCmTJni9tO+X3/99bmLhMbGxrJ69WqHE4m4t+uuu44rK5Yj5c+fzjnONyyK7ONHsJkZAKSsm8u1DeOoU6cOe/bsITo6ulA1GMYYRr/9Nl988QUb/lhPYGAgBw4ccDqWx1GDJVIAvhg/nha3tOLxxx/ns88+czqOiJAz7fvDDz98yrTvqceP07lzZ4+Y9r18+fIcPHgQgLi4OCZNmuRwIhH3NnjgC2Su+eqck08FlKwCNpu0vzdiMzNIW/0Vrw1+hdTUVH799Vfi4grnBdM777wzd8KLYsWKefTEQU5QgyVSAIwxzPl2NvXiGnDffffx5ZdfOh1JRE7iqdO+Fy1alPT0dKpWq06XLl149rnnnY4k4rZat25N0WAfUrf/ctYxodVuAAxHV83g2O8/UKd2DRo0aMAHH3xASkoK3bp1c11gN1OnTp3cqdurVavGzJkzHU7kOdRgiRQQYwwrl/9M+QoV6dChA99//73TkUQkD6dP+96xU7xbT/vu7+/PH+t/58GHuvP6sNdo0vQmt73qJuIkHx8fXn7hOTJ//eqsYwJiyhNe7z+kbFrKkQUfcn3DOPr370+/fv1o2rRpoZ9Nr0SJEhw/fpwrSpakbdu2DHzpZacjeQQ1WCIFyMfHh82bNlK0aCQtWrRg2bJlTkcSkXOoWrUqU6dMJjs7mxUrVtDo+sZMnzaVatWqYYyhV+/e7Nq1y+mYGGP48IP3GTfuXRYvWkhwcDDJyclOxxJxO127dsXn6D+k/b3prGMim3UnpOoN+PrAqFGjmDhxIr1792bWrFn4+OirclBQEHv37OHObt0YPOgVbmh6o07qnId+a0QKmJ+fH//8k3OJvVGjRvz666/nHJ+dnc1d995Py/+0dUU8EcnDiWnfl/y0mMzMTL7//nsqVKzE2HfeoWzZshhjGDJkCImJiY7mfOSRh1m4cCEZGRmEhYWxd+8lrWUr4rX8/f159qknyVhz9qtYAGm715OWmkp6ejrpGZnExMSwdetWMjMzXZTUvRlj+GL8eP7733G5a/IdOXLE6VhuSw2WiAsEBASQkpICQN26ddm4cWOe46y19OzVm28WrWTxjwv5559/XBlTRPLg6+tLs2bN2LZ1C6mpqUyZMoXgkBAGDBhATEwMxhjeffddjh075ki+pk2bsnXrVgBKly593pM4IoXNwz26k77rdzIO7Mlzf8qfi6l2ZQWmT5/Orbf+h8SE/Tz//PPUqVMHf39/jDG0at2a6dOns3//fhendy89ez7CkiVLAIiIiGDHjh3OBnJTarBEXCQ4ODj3bE/VqlXzLEpPPfMck2Z9T/jtAwitVJ+vvjr3GTcRca3AwEA6depESnIyR48e5b333gOgZ8+ep0z7npaW5tJcFStWzJ1KuW7dukybNs2lxxdxZ2FhYTz2aE/S1nx9xj5rs8lYPY03hw2lffv2fPPNLKy1ZGZm8ttvvzFs2DBKXHEFc777jo4dO1KiRAmMMYSGhfHCCy+wcuVKt1/mIb81atSInTt3AlChQgV+/PFHhxO5HzVYIi4UHh6e+yWoQoUKp9zO88rgIXwwfjLh7V7CJygMU/4aPp8wxaGkInI+YWFh9OjRI3fa98GDB+dO+x4UFET5ChVdOu17ZGQkaWlpVLqyMp06deLFAQNdclwRT9CvzxMc37iErGMHT9mesnEppaOL0rJly1O2+/r6UqtWLZ555hn2/f031loOHDjA7Nmzie/cmZTkZF599VUaNmxIYGAgxhiub3wDX3zxBXv25H2lzJuUKVOGo0eP4u/vz4033shbb7/tdCS3ogZLxMUiIyNzbzEoXbo0CQkJjBg5ihHvvEd4h1fwDYkAILhifVat/JnDhw87GVdELkB0dDQvvvhi7rTvvXr35q8d210+7XtAQACbN23k7nvvY+iQwTRr0ZLs7OwCPaaIJ4iJiaHrnXeSsub/TzVurSVz9TSGDXkFY8x5PyMyMpLWrVszedIkrLVkZWWxYcMGRo8eTYWKlVi65Ce6detGbGwsxhiMMfTp04elS5eSmppakD+eI8LCwkhNTaVlq9b07dOH9h07qd78y7jbGh+XKy4uzq5atapAPjsrK4u5c+eedf+tt94KwOzZs/PcHxgYyM0331wg2cTz7Nmzh9jYWADCil1BRPyr+EUUP2VM8swhvP1Cb7eeJtYYs9paWzhXYqRga454vj///JMXBwxk2tT/fzW6Q8dODB0ymKpVqxbosceOHUuvXr0ICQ0lYf9+QkJCCvR4rqB6o3pzObZv387VtesS/eAH+ASGkLJ5OUU3fMnG9WsvqMG6EEePHmXlypV8Pn48n37yyRn7a9epy+O9e3HTTTdRvnz5fDuu04YNe53nnnuWiKKR7N2z2yvqDVx6zVGDdREWLFhA8xYtib6qfp77k3ZtxScgiMgSpc/Yl52VReLGVWzbto0KFSoUSD7xPCNHjqR///6U6vE+/pGlzth/bO1cGvrtZPYM912oWF949IVHzs9ay+rVq3miT1+WLvkpd/tjvXrxzNNPU6ZMmQI57vz582nWrBkAf//9N1dcccUFvW/btm1ERERQrFixAsl1qVRvVG8u1+0d4/npYBHCGrTnyMSn+GDEYDp16lRgx7PWsn37dubPn8/oMe+wbu1vZ4x56KGH6Nq1Kw0aNCAsLKzAshS0uXPncssttwA5J5FLlTrze42nUYP1r4IsPpmZmZQpXwl742MExV59Ue89tn4BFRJ/ZuWyn84/WAqFr776irvuf4giHV4hIKZ8nmOyUg6T+PHDHEjYT3BwsGsDXiB94dEXHrk4WVlZLFy4kO49Hmb7tq252wcNGkTPnj2Jjo7O1+Nt3ryZKlWqALB27Vpq1qx5zvE7duygRq063ND0Rr6d6V4T7ajeqN5crjVr1nBDs1sIuekRQtdNZuuff7h8ravjx4+zevVqJk+ezJgxY87Yf2XlKvR54nGaN29OlSpVPOoq15YtW6hcuTIAK1euJC7u/P933bRpEx3i72DqpAkFfmX/Yl1qzdEzWBfBz8+PgS88R+bq6Rf1PmuzyfxlOkNf0QPHkmPu3Lncdd+DhLd98azNFYBvSAShJa9k3rx5rgsnIgXq5Gnf09LSmDJlCiGhoQwcOLBApn2vXLly7npdtWrV4uuvz5xJ7YTU1FRat2lHYN02/PjjQrdYVFkkP9WtW5c6tWpycPYIhr480JGFhIODg2ncuDGjR4/GWpv77Obnn3/Otdc1YsvmTfTq1YuqVavi4+ODMYYud97Jd999x6FDh1ye92JceeWVHDyYM5FIgwYN+PTTT885PiUlhVvbtmfr/qMMHzHKBQldQw3WRbr//vvITtpB+j/bLvg9xzcvp2RUEVq0aFGAycRTLF68mA6duxB22zMElqx83vHZ5RrwxaSpLkgmIq4WEBBAp06dSD52LM9p34OCg/Nl2vdixYqRmppKmbLlaNeuHYMHD8lz3EMP92S/iSTs2jsIqXYjo8eMvazjirij14cOolWr1txxxx1OR8lVpkwZ7rrrLpYtXYK1ltTUVJYvX84zzzxDUHAwkyZOpHXr1kRGRmKMoVTp0rzxxhusW7fOZTOVXqiiRYuSkZFBvbgG3H///XTv8fBZJ/h56OGeHAy8guiOLzNx4sTcmZY9nRqsixQUFMSzTz1J+gVexbLWkvnLdIa8PMCjLvFKwVi1ahX/aduO0Fv6XfBtpiFVruObb2ZpNXkRL3fytO+JiYkMGTKEtNTUfJv2PTAwkL92bOeOO+9k4MAB3HrbbbkzfqWmptKmbTtmzF1AaPPHMMYQWPtW3vvwQ44fP56fP6aI466//npmfjkVX19fp6OcVWBgIA0bNmTYsGEcT0nBWsvff//N1KlTad68BX/v3cvTTz9NrVq18PPzwxhDmzZtmTFjRu4Vayf5+fmxeuUKnnzqaT784H0qXVn5jBNFH374Ed/8sIjQZj3xDYsk5MprePe99x1KnL/UYF2CR3s+QvqutWddERxybgs8svIr9oy7n4M7/6RPnz7079+f5ORkFyYVd7Jjxw5ubNaCwCbdCa5Q94Lf51ekOAFFS7Bo0aJzjtu0aRMDBw7k2muvJSYmhvDwcOrUqcPQoUP1eyfiYYoVK8YLL7yQe+tQ78cfP2Xa9+saXc+KFSsuetp3YwwTv/iCkaNG8e033xBVLJrjx48zbtw4vvluDuG3PYtPQM7znv5RpQkocSUTJkw443NUb0Rc74orrqBjx47MmzcXay0ZGRmsWbOGQYMGEVUsmlmzZnL77bfn3mocUTSSl19+mV9++YWMjAxHMr8x/HWmTJnC9m1bCQoKym3+fvvtN/o8+RShtz6dW3MC6tzGyLdH55nV02qOGqxLEBYWxhO9e5F2jqtYB3/4gIPzP8QnO4P77r2X+Ph4Ro8eTZs2bbRGQCEVFBRE9Ro1SZ4/jmNzR3N8+xps9oWdibblGjBxyrlvE/z4448ZNWoUlSpVYuDAgbzxxhtcddVVvPjiizRq1EhnoUU8VJkyZRj99ttYa/nzzz/pFN+Zn5ct5ZprrsHHx4eOneLZsGHDRX1m3z59mDdvHocPHSQkJITnB145OD8AABehSURBVL5Csf/0xb/YqbMZ+tZozbARb53RyKneiDjPz8+POnXqMGDAAJISE3Kvfs+cOZN27dtz5PAhXvl/7d15eJTlucfx752dJBDDYtj3sEO1LBa1xYKpaOuCULRWxaVSRI5F7LF6XEpAjltt9YAHXNqqqEXEniPYFiuoFZUInMqOArUQgrGyJ5EkJJnn/JERE7IwIe/Mm+X3ua65mOWZuZ8nGX6Ze2be983MZOjQocTFxWFmfHf0GBYvXkxubm7E5jlhwgQ2bdoElB+PbPXq1Yy54EISvn0DcW27Hh8Xl9YL1zKNJUuqvt5pbJmjvQieooMHD9Kle09Sr/4NMa0qH7vo2L7d5P5uGvFdBpJSdpicXZ8SGxvL3LlzufXWW3nxxRcb9HGNJLz27t3Lopdf5plnF7Inew/xfc8hrs+3ievYr8avkZbs30PRskz25e6tcYPcdevWkZ6eTkpKSqXr77nnHubMmcPcuXOZNm2a5+vRXr20Vy+JvK92+z79thm8/96q49fXdbfv27ZtY8CAASQNOI+2F/+8mjoBDj83jT8teZFzzz33+PXKG38ob6SuAoEA27Zt44033uCxxx9nT3Z2pdtjY2OZPn06l19+OWeeeSbx8fFhm8u+ffs4/fTy18ytzriA1Av+rcqYo9tXk/bP5Wz6qPLzvLFljj7BOkWtW7fmxhtuoOj/qu6N6ctt7wKO+Ci4565fEBsbC8BNN91EYmIiL7zwQoRnKw1Jp06duH3GDLZt/IiP1q7mtCM7yFv6AAd/N5n8Vc9zbN+uKveJbduFsuh4avvDOmzYsCrBAxzfiHfz5s2erUFE/GVmDBs2jPdWvUtpaSkrVqygZ6/ePDFvHl27dsXMmD179km3xXhu4Yu06j6YNt+/rYY6UcQMHstDjz5W6XrljUjjEBUVxcCBA5kxYwbZu3fjnOPw4cP89a9/5cdXX01JSQmPPPIII0eOJCEhATNjxFnf4vnnn2d3cLxX2rVrx8OPPEpS206cljG12jEteo8g+7PPycrKqnR9Y8scNVj1cOcdP+fo1rcpO3qk0vXHcreDGeR9zk9uvPH49QkJCZxxxhmsXbs20lOVBio9PZ2Cgi+J6TmC0sJ8OhRsp2jZbI688DPysl6h5PDnx8dG9RjB4iWv1rlGTk4OAGlpaZ7NW0Qajq92+/6PnTsoLi5myZIlVXb7Pn/+fPLz8yvdb9myZcxb8DStfnAHFlXzxv5Jg85n5Yo3j2dJbZQ3Ig1fSkoKGRkZvLBwIc45AoEA27dvZ/78+fTrP4C1az5k0qRJdO/e/fhu4qdOncq7777L0aNHT7luVlYWmffPIWV8Zo2ZY1HRxAy+iDkP/Sqkx2yomaMGqx46duzIxIkTOfr3pZWuLys4iEXH8It/v73KwWE7derE/v37OXbsWCSnKg1c8lkTaHvDk3ye2IuiwiIyzh3OhV0c+S/fQcErd5L3f8uI6dCfRa8sqdO7SWVlZcyaNYuYmBh9LVWkGYiLi2P8+PFVdvs+depUWrVqdXy371u3buXH115P8kX/TnRSaq2PGRWfSGL/85j7xH/XOk55I9I4mRnp6elMmTKFbVu34JyjoKCAd955h5/+9KcAzJ8/n1GjRpGUlISZMWDgIJ588kl27twZ0uuS/fv3c8nlE0gccwuxp7WvdWzS4AxWrniT7BO+zniihpw5arDq6b6776Jw4xsEir/eg0mg+CiUlTLtlqoffyYkJADU6x0AaZqiE1NIHnU9ra95nLf+kcfSZa8z/dZ/48mHZ3Je6hHyl/+avbs+PWngVDR9+nSysrKYNWsWffv2DePsRaShqW2374PO+CYxQy8noXP/kB4r/hsXseDJpykqKqpxjPJGpOlISkpi1KhRLFiw4PinXLt27eL3v/89Q4cNZ9vWLUyZMoX09PTjn3JdO2kSK1asIC8vr9JjBQIBLp/4IwI9ziYx/ayT1o6KTySh/3f5zX/NrXVcQ84cNVj11LNnTy4cO5aj6//89ZWlhbRo0YJWrVpVGf/VH6fExMRITVEamZhWbUkeM5VWVzzIf7+2ihsn38y5I89ib/ZuVq1aRbdu3UJ6nHvvvZd58+YxefJk7rrrrjDPWkQasq92+x4IBPjBpZeT3HsELYdeEvL9Y9t0JnBaJxYtWlTt7cobkabNzOjWrRvXXXcd69aWHyKisLCQDz74gBkzZhAdHc3C558nIyODlJSU8vE9evDYY48x7dafsWn3FySdc3XI9Vp882Lmz19AQUFBtbc39MxRg+WBzPvupuij1wmUFFGavx93rIiioqIqB1SD8j3ItW3blri4OB9mKo1JbGpHksfOIPHS+/jPpxfTb9AQPv74k5AOODxz5kzuv/9+rr/+ehYsWBCB2YpIY7B8+XL+tOw14nqNIFCYd/I7VNBi6GXccfd9Vb4OpLwRaZ4SEhIYOXIkjz76KKWlpTjnyveUvGgR3xl1Htm7dnHbbbex4JnfkzT29lq39TxR7GntsbQ+jMn4XpXjYjWGzPG1wTKzsWb2iZntNLM7q7k93sxeDt7+oZl1j/wsT27QoEGcffZICjb8lbysJQwe8g0CgQBr1qypNK6oqIj169czbFiz3cOsnIK403uQfMndRI2ezh0PzqNnn/4sXryYQCDAgYJiNuw5zIGCr5v5zMxMMjMzufbaa3nmmWdq3PV7c9RUMkfkVI0YMYLMmTPpm7+efc9MJmf+9ez/y1wKNr9F6ZF/1botRYueQzmY9yVXT552PHOUNzVT3khz1LFjR6644gr+9s7bOOeYOXsO0a6MI6/dz8EVT3F0+weUFRwK6bFSRk5k3YYtnHXueRw4cABoPJnj23GwzCwa2A5kADnAWuBHzrmtFcZMBYY456aY2ZXAOOfcFbU9rl/HiHhk4TLunHwVrrSEThPvY+8f7mHcuHG8+urXe3376jhYCxcu5OqrQ/+YVJq2tM7diPnBfSfd6BPKj31TtGs9JVkvkhgXhQ2/kpTewyl1jofHD2H90t/yy1/+kmuuuYZnn322xmNmeamxHJemqWWOSH39cmYmj7/yNlEd+lKcs4WinC2YRRPfZSAJnQcS33kAse26YfZ1jhxZ+7/krX6ZdmNuZHTnaP6w4FHlTTWUNyJfKygoYM2aNbz33vu8vvxN1q39kOikVOI79T9+im3XrconXM45cp+bTkxKGi3y93DV+EuZN29eo8gcPxuskcBM59wFwct3ATjnHqgw5o3gmNVmFgN8DrRztUzaj/A5UFDMOQ+9xfZHfogrK4FS7SFQ6qbTzc8S06ptyOOdcxz95H0O/PkxWg67hNTvXEvhhj/xxfL5dO3aldmzZ1cJnrS0NDIyMryeemN6wdNkMkfEC/0GncHhwVeQ0G0IUJ4rpYdzKd6zhaKcrRTnbCFw9Ej5C6AuA4nvPJDY1I7sffqnEAjgSgrp3KULc+6/X3lzAuWNSPWWLFnCzTN/Q9y3rqFo7zaK927j2GcfU5q/n/gO6cR3LG+44jr1IzohmYLNb/Hl5reITkrly61v065dO371q181+MyJ8XwmoesE7KlwOQc4cdcix8c450rN7AjQBqh05EQzmwxMBujatWu45lujnEOFxEZFkXblf3J0+wdYTCxxUZBOLp9sXs/hw4dJTExk8ODBjB49OqxHyZbGJzNzFi5w8u2qvuKco3DHao68/xJxp/cksXf5f5tjuTsAyM7OZtKkSVXuN2rUqLCETyPSZDJHpL6ys7PJ3pNNu4sGHr/OzIhN7Vi+/eeQ8qwoKzhEUc4WinO2cnDFAkoP7sUFAkTFJuBKIGfPHuVN9ZQ3ItX4cM1aylr3ILZtF2LbdqHlN74HQFlhPsc++5iivR+Tt/aPFC/dQUzLdsS170XR7g0k9BwKwL59+xpF5vjZYFX3pckT37UJZQzOuaeAp6D83Z36T61uOqe2oCQQIL59L+Lb9wIgITaKpb8YTZtkNVNSu7kLng5pnHOOot0bOJb1Iq0TjLjzbyS66zePf/847eIZ7HzvdT3natZkMkekvv74xz+S2Gt4NV/JCVCWf4CSg3spPbgX8nKJyf8c27+H0gNfENWyDdEtWhGb1ovkDr3Y8NKDpJ2W5NMqGjTljUg1VmWtISZtVJXro1u0pEWv4bToNRyAQFkJRz9+n6Mfv0t0q7YU7dnEmd86l4mX/oCpU2+udk/dDYmfDVYO0KXC5c7AZzWMyQl+fJ4CHIzM9ELXJjmeh8cP4Y5XNxIbFUVJIMDD44foha54pnjvxxzLepEWJUd4/ME5TJw4kdc35uo5VzdNJnNE6mvhoiWUJnWnYPNbBA59RkxBLmWHPiP/ixySkpPp0Tudgf37MSTjbPr160efPn3YkhfPfyzdVilz1FzVSHkjcgLnHJs3rCf1mhurvb2s4BCFu/6O5Wwk/9O/E4hNomXvobQe9n1+feuPmDgyPcIzPnV+NlhrgXQz6wHsBa4ETjwM81JgErAamAC8Vdt3k/10yRmdOKd3W3IOFdI5tYVe6Ionju3bxbGsl+DAP3lgVibXX38dsbGxgJ5zp6BJZY5IfcTGRHP6wU30bVfMGWMG0L/fxfTp04c+ffrU+M5wX2BU/w7KnNAob0ROsHv3biw6lujkVABc6TGKcrZSmr0et2c9xYe/4NvnfZfLp07kggt+S3Kb9o02b3xrsILfN54GvAFEA79zzm0xs1nAOufcUuC3wEIz20n5uzpX+jXfULRJjm90TwBpmEoO5VL84SJK92zk3rvv4papN5OQkFBlnJ5zoWuKmSNyqrLe+9sp3U+ZExrljUhV69atI6plG/LWvUb0ZxvJ37WZ3n37c9nFF/L9C2cwfPhwYmIqtyaNNW/8/AQL59yfgT+fcN19Fc4XAT+M9LxE/FKav5+iNYsp2rGa26f/jJ/f/j+0bNnS72k1GcocEYkU5Y1IZdHR0cSXFPC9zqVcNuXnjBkzhtTUVL+nFRa+NlgiUi5QmEfBxr9QuHklN/3kBu5d/jxt2rTxe1oiIiIinhg3bhzjxo3zexoRoQZLxGcGHHzlHq666sfMWbKFjh07+j0lERERETlFarBEfPbqyy/Rvn17evXq5fdURERERKSe1GCJ+Oycc87xewoiIiIi4pEovycgIiIiIiLSVKjBEhERERER8YgaLBEREREREY+owRIREREREfGIGiwRERERERGPqMESERERERHxiBosERERERERj6jBEhERERER8YgaLBEREREREY+owRIREREREfGIGiwRERERERGPqMESERERERHxiBosERERERERj6jBEhERERER8YgaLBEREREREY+owRIREREREfGIGiwRERERERGPqMESERERERHxiBosERERERERj6jBEhERERER8YgvDZaZtTazN81sR/Df1BrGLTezw2b2eqTnKCJNhzJHRCJFeSMifn2CdSew0jmXDqwMXq7OI8A1EZuViDRVyhwRiRTljUgz51eDdSnwXPD8c8Bl1Q1yzq0E8iM1KRFpspQ5IhIpyhuRZi7Gp7ppzrlcAOdcrpmdXp8HM7PJ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\n",
      "text/plain": [
       "<Figure size 864x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "edges_isolated = {0: {1, 2}, 1: {0, 2}, 2: set()}\n",
    "\n",
    "_ = retrofitting.plot_retro_path(Q_hat, edges_isolated)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### All nodes connected to all others, but $\\alpha = 0$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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RERERET+CA1YJVCVKlV46KGHyMvNZfjw4W7HERERERGRs6QBq4R67rnnMB4PTz75JKmpqW7HERERERGRs6ABqwTbtHEjAHXiE1xOIiIiIiIiZ0MDVgkWHx9Pz543cPTIYcaPH+92HBERERER+R0asEq4Dz6YCkD//v3JzMx0OY2IiIiIiJyJBiw/sHTpUgAaNGzkchIRERERETkTDVh+oEWLFrRp25bkbVuZMWOG23FEREREROQ0NGD5ifnz5gHQrVs3cnNzXU4jIiIiIiJF0YDlJzweD1999RUAbdu1czmNiIiIiIgURQOWH7niiitIqFuPRT//zKJFi9yOIyIiIiIiJ9GA5WdWr1oJQMuWLfF6vS6nERERERGRgjRg+Znw8HDefPNNAHr06OFuGBERERERKUQDlh/q27cv5SpU5NNPP2XDhg1uxxERERERkRM0YPmprZs3AVC/QQOXk4iIiIiIyG80YPmp8uXLM3LkSLCW++67z+04IiIiIiKCBiy/9vjjjxMcEsp///tf9uzZ43YcEREREZFSTwOWn9u2dQsAdeITXE4iIiIiIiKuDljGmK7GmHXGmI3GmEeK2D/QGLPSGLPcGDPfGNPYjZwlWc2aNenffwBZmRk8//zzbseREkC9EnGWOiXiLHVKAp1rA5YxJggYC1wJNAZuLqJAk621Ta21zYHngP/4OKZfGDfudQAefPBB0tLSXE4jblKvRJylTok4S52S0sDNI1gtgY3W2s3W2mxgCtC94AJr7ZECD6MA68N8fmXNmjUAxNet53IScZl6JeIsdUrEWeqUBDw3B6wYYHuBxztObCvEGHO3MWYTx9/BuMdH2fxOo0aN6Nr1SlL27WXq1KluxxH3qFcizlKnRJylTknAc3PAMkVsO+UdCmvtWGttXeBhYGiRL2TMAGPMYmPM4v379zsc03988cV0AG666Says7NdTiMuUa9EnKVOiThLnZKA5+aAtQOoVeBxLLDrDOunANcUtcNaO85am2StTapSpYqDEf2Lx+Nh/vz5AJzfooXLacQl6pWIs9QpEWepUxLw3BywFgGJxph4Y0wocBMwreACY0xigYfdgA0+zOeX2rVrR9Pzz2ftmjV8++23bscR31OvRJylTok4S52SgBfs1he21uYaYwYDXwNBwERr7WpjzAhgsbV2GjDYGNMJyAEOAn3dyutPli5e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TJzNGqy144BxAElJSY69uxFbIYIcr5eyLboR1agDB6Y/z76pw6jc/WHKtrzulPXerGOER0Yza9YspyII0LJ9B7bFXkZEnean7PPmZJE+93XyDu2hZr8XCakUC0C1q+5n4/zpVIoOO+U5Aa7E90rEz6hTIs5SpyTguXlRyg6gVoHHscCu060xxgQD5YBUn6QDKkWH8VyPZoSHeChfrjy1bvon117djUPvP0Bm8gpfxZDTyDm4myMfPEyHehV4Z9pMylSvTZmwYMJDPDzXo1lpHK7AD3ol4mfUKRFnqVMS8Nw8grUISDTGxAM7gZuAXietmQb0BX4Crgfm+Pr826ubx9CuXmV2HMwgtkIElaK78c01nbjh5lvJa34VkUnX6porFxzbuJD0WWN5esRw7hkyGGMMHZvWLvDvVCqHK/CTXon4EXVKxFnqlAQ81wasE+fUDga+BoKAidba1caYEcBia+00YALwjjFmI8ffubjJjayVosMK/cDepUsXVixbTLfu17Fr+jqiutyDJyzKjWiljvXmkf7jZMymecz6cjpt2rTJ33fyv1Np5E+9EvEH6pSIs9QpKQ3cPIKFtXYGMOOkbU8U+H0m0NPXuc5G7dq1WbzgB+4e8nc+eP9Bors9THDZqm7HCmh56YdI/+p5GtYox2crllOlShW3I5VI/twrkZJInRJxljolgS7wbwxUjMLCwhg/7jVefm4URz4eRvqauW5HClhZu9Zy6P0HuP26K5g3d5aGKxEREREpkVw9ghUo+vTpTYsWzfnLVdeQocuxHGcwZC/7jCnvvcvVV1/tdhwRERERkdPSgOWQpk2bsuqXpfz6669uRwk47705Ho/HQ0JCgttRRERERETOSAOWg8qVK0fr1q3djhFw6tWr53YEEREREZGzomuwREREREREHKIBS0RERERExCEasERERERERByiAUtERERERMQhGrBEREREREQcogFLRERERETEIRqwREREREREHKIBS0RERERExCEasERERERERByiAUtERERERMQhGrBEREREREQcogFLRERERETEIRqwREREREREHKIBS0RERERExCEasERERERERByiAUtERERERMQhGrBEREREREQcogFLRERERETEIRqwREREREREHKIBS0RERERExCGuDFjGmIrGmJnGmA0n/lvhNOu+MsYcMsZM93VGEX+j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\n",
      "text/plain": [
       "<Figure size 864x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = retrofitting.plot_retro_path(\n",
    "    Q_hat, edges_all,\n",
    "    retrofitter=Retrofitter(alpha=lambda x: 0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## WordNet\n",
    "\n",
    "Faruqui et al. conduct experiments on three knowledge graphs: [WordNet](https://wordnet.princeton.edu), [FrameNet](https://framenet.icsi.berkeley.edu/fndrupal/), and the [Penn Paraphrase Database (PPDB)](http://paraphrase.org/). [The repository for their paper](https://github.com/mfaruqui/retrofitting) includes the graphs that they derived for their experiments.\n",
    "\n",
    "Here, we'll reproduce just one of the two WordNet experiments they report, in which the graph is formed based on synonymy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### Background on WordNet\n",
    "\n",
    "WordNet is an incredible, hand-built lexical resource capturing a wealth of information about English words and their inter-relationships. ([Here is a collection of WordNets in other languages.](http://globalwordnet.org)) For a detailed overview using NLTK, see [this tutorial](http://compprag.christopherpotts.net/wordnet.html).\n",
    "\n",
    "The core concepts:\n",
    "\n",
    "* A __lemma__ is something like our usual notion of __word__. Lemmas are highly sense-disambiguated. For instance, there are six lemmas that are consistent with the string `crane`: the bird, the machine, the poets, ...\n",
    "\n",
    "* A __synset__ is a collection of lemmas that are synonymous in the WordNet sense (which is WordNet-specific; words with intuitively different meanings might still be grouped together into synsets.).\n",
    "\n",
    "WordNet is a graph of relations between lemmas and between synsets, capturing things like hypernymy, antonymy, and many others. For the most part, the relations are defined between nouns; the graph is sparser for other areas of the lexicon."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "======================================================================\n",
      "Lemma name: Crane\n",
      "Lemma Synset: Synset('crane.n.01')\n",
      "Synset definition: United States writer (1871-1900)\n",
      "======================================================================\n",
      "Lemma name: Crane\n",
      "Lemma Synset: Synset('crane.n.02')\n",
      "Synset definition: United States poet (1899-1932)\n",
      "======================================================================\n",
      "Lemma name: Crane\n",
      "Lemma Synset: Synset('grus.n.01')\n",
      "Synset definition: a small constellation in the southern hemisphere near Phoenix\n",
      "======================================================================\n",
      "Lemma name: crane\n",
      "Lemma Synset: Synset('crane.n.04')\n",
      "Synset definition: lifts and moves heavy objects; lifting tackle is suspended from a pivoted boom that rotates around a vertical axis\n",
      "======================================================================\n",
      "Lemma name: crane\n",
      "Lemma Synset: Synset('crane.n.05')\n",
      "Synset definition: large long-necked wading bird of marshes and plains in many parts of the world\n",
      "======================================================================\n",
      "Lemma name: crane\n",
      "Lemma Synset: Synset('crane.v.01')\n",
      "Synset definition: stretch (the neck) so as to see better\n"
     ]
    }
   ],
   "source": [
    "lems = wn.lemmas('crane', pos=None)\n",
    "\n",
    "for lem in lems:\n",
    "    ss = lem.synset()\n",
    "    print(\"=\"*70)\n",
    "    print(\"Lemma name: {}\".format(lem.name()))\n",
    "    print(\"Lemma Synset: {}\".format(ss))\n",
    "    print(\"Synset definition: {}\".format(ss.definition()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### WordNet and VSMs\n",
    "\n",
    "A central challenge of working with WordNet is that one doesn't usually encounter lemmas or synsets in the wild. One probably gets just strings, or maybe strings with part-of-speech tags. Mapping these objects to lemmas is incredibly difficult.\n",
    "\n",
    "For our experiments with VSMs, we simply collapse together all the senses that a given string can have. This is expedient, of course. It might also be a good choice linguistically: senses are flexible and thus hard to individuate, and we might hope that our vectors can model multiple senses at the same time. \n",
    "\n",
    "(That said, there is excellent work on creating sense-vectors; see [Reisinger and Mooney 2010](http://www.aclweb.org/anthology/N10-1013); [Huang et al 2012](http://www.aclweb.org/anthology/P12-1092).)\n",
    "\n",
    "The following code uses the NLTK WordNet API to create the edge dictionary we need for using the `Retrofitter` class:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_wordnet_edges():\n",
    "    edges = defaultdict(set)\n",
    "    for ss in wn.all_synsets():\n",
    "        lem_names = {lem.name() for lem in ss.lemmas()}\n",
    "        for lem in lem_names:\n",
    "            edges[lem] |= lem_names\n",
    "    return edges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "wn_edges = get_wordnet_edges()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### Reproducing the WordNet synonym graph experiment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "For our VSM, let's use the 300d file included in this distribution from the GloVe team, as it is close to or identical to the one used in the paper:\n",
    "\n",
    "http://nlp.stanford.edu/data/glove.6B.zip\n",
    "\n",
    "If you download this archive, place it in `vsmdata`, and unpack it, then the following will load the file into a dictionary for you:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "glove_dict = utils.glove2dict(\n",
    "    os.path.join(data_home, 'glove.6B', 'glove.6B.300d.txt'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is the initial embedding space $\\widehat{Q}$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_glove = pd.DataFrame(glove_dict).T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300, 400000)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_glove.T.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Now we just need to replace all of the strings in `edges` with indices into `X_glove`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_edges_to_indices(edges, Q):\n",
    "    lookup = dict(zip(Q.index, range(Q.shape[0])))\n",
    "    index_edges = defaultdict(set)\n",
    "    for start, finish_nodes in edges.items():\n",
    "        s = lookup.get(start)\n",
    "        if s:\n",
    "            f = {lookup[n] for n in finish_nodes if n in lookup}\n",
    "            if f:\n",
    "                index_edges[s] = f\n",
    "    return index_edges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "wn_index_edges = convert_edges_to_indices(wn_edges, X_glove)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "And now we can retrofit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "wn_retro = Retrofitter(verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Converged at iteration 10; change was 0.0043 "
     ]
    }
   ],
   "source": [
    "X_retro = wn_retro.fit(X_glove, wn_index_edges)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "You can now evaluate `X_retro` using the homework/bake-off notebook [hw_wordsim.ipynb](hw_wordsim.ipynb)!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Optionally write `X_retro` to disk for use elsewhere:\n",
    "#\n",
    "# X_retro.to_csv(\n",
    "#     os.path.join(data_home, 'glove6B300d-retrofit-wn.csv.gz'), compression='gzip')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Other retrofitting models and ideas\n",
    "\n",
    "* The retrofitting idea is very close to __graph embedding__, in which one learns distributed representations of nodes based on their position in the graph. See [Hamilton et al. 2017](https://arxiv.org/pdf/1709.05584.pdf) for an overview of these methods. There are numerous parallels with the material we've reviewed here.\n",
    "\n",
    "* If you think of the input VSM as a \"warm start\" for graph embedding algorithms, then you're essentially retrofitting. This connection opens up a number of new opportunities to go beyond the similarity-based semantics that underlies Faruqui et al.'s model. See [Lengerich et al. 2017](https://arxiv.org/pdf/1708.00112.pdf), section 3.2, for more on these connections.\n",
    "\n",
    "* [Mrkšić  et al. 2016](https://www.aclweb.org/anthology/N16-1018) address the limitation of Faruqui et al's model that it assumes connected nodes in the graph are similar. In a graph with complex, varied edge semantics, this is likely to be false. They address the case of antonymy in particular.\n",
    "\n",
    "* [Lengerich et al. 2017](https://arxiv.org/pdf/1708.00112.pdf) present a __functional retrofitting__ framework in which the edge meanings are explicitly modeled, and they evaluate instantiations of the framework with linear and neural edge penalty functions. (The Faruqui et al. model emerges as a specific instantiation of this framework.)"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "widgets": {
   "state": {},
   "version": "1.1.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
